package com.ideaaedi.zoo.example.springboot.seata_sharding.alpha.controller;

import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
import com.ideaaedi.zoo.diy.artifact.apidoc.knife4j.annotation.ApiTag;
import com.ideaaedi.zoo.example.springboot.seata_sharding.alpha.service.BizService;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping
@ApiTag(name ="测试")
public class TestController {
    
    @Resource
    private BizService bizService;
    
    /**
     * <pre>
     * 断点时，观察数据：
     *   这四张表pay_record_202408和pay_record_202409、trans_record_202408和trans_record_202409中
     *   ，都分别有三条数据。以trans_record_202409的数据为例进行说明：
     *        Alpha 备注B       (这条数据是本服务添加的。因为ShardingSphere的BASE分布式事务不支持隔离级别，所以此时哪怕方法还没结束，我们也能查询到其插入的数据了)
     *        Beta 备注B        (这条数据是beta服务添加的)
     *        Alpha 备注B       (这条数据是本服务添加的。因为ShardingSphere的BASE分布式事务不支持隔离级别，所以此时哪怕方法还没结束，我们也能查询到其插入的数据了)
     *
     * 断点后，观察数据：没有任何数据了，都被seata回滚了
     * </pre>
     */
    @GetMapping("/test")
    @Operation(summary = "【注解方式】本地alpha服务和远程beta服务（通过feign调用）分表添加数据，然后本地异常，触发分布式事务回滚")
    @ApiOperationSupport(order = 1)
    public void test() {
        bizService.test();
    }
    
    /**
     * <pre>
     * 断点时，观察数据：是插入有一些数据的（这里就不展开一一介绍了）
     *
     * 断点后，观察数据：没有任何数据了，都被seata回滚了
     * </pre>
     */
    @GetMapping("/testNested")
    @Operation(summary = "【注解方式】测试Transactional注解嵌套")
    @ApiOperationSupport(order = 2)
    public void testNested() {
        bizService.testNested();
    }
    
    /**
     * <pre>
     * 断点时，观察数据：是插入有一些数据的（这里就不展开一一介绍了）
     *
     * 断点后，观察数据：没有任何数据了，都被seata回滚了
     * </pre>
     */
    @GetMapping("/testManual")
    @Operation(summary = "【手动方式】本地alpha服务和远程beta服务（通过feign调用）分表添加数据，然后本地异常，触发分布式事务回滚")
    @ApiOperationSupport(order = 3)
    public void testManual() {
        bizService.testManual();
    }
    
    /**
     * <pre>
     * 断点时，观察数据：是插入有一些数据的（这里就不展开一一介绍了）
     *
     * 断点后，观察数据：没有任何数据了，都被seata回滚了
     * </pre>
     */
    @GetMapping("/testNestedManual")
    @Operation(summary = "【手动方式】测试Transactional注解嵌套")
    @ApiOperationSupport(order = 4)
    public void testNestedManual() {
        bizService.testNestedManual();
    }
}
